#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
QNX进程监控数据可视化工具

该脚本用于读取QNX进程监控工具生成的CSV数据文件，并生成可视化图表。
"""

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime
import os

#################################################
################ 配置参数区域 ####################
#################################################

# 要读取的CSV数据文件路径
CSV_FILE = "logservice_monitor_20250410_171715.csv"  # 替换为你的CSV文件路径

# 输出图表文件，留空则显示图表而不保存
CPU_CHART_FILE = ""  # 例如: "cpu_usage.png"
MEMORY_CHART_FILE = ""  # 例如: "memory_usage.png"

# 是否显示图表（即使设置了输出文件）
SHOW_CHARTS = True

#################################################
################ 程序代码区域 ####################
#################################################

def load_data(csv_file):
    """
    加载CSV数据文件
    
    Args:
        csv_file: CSV文件路径
        
    Returns:
        DataFrame对象
    """
    try:
        df = pd.read_csv(csv_file)
        # 将时间戳列转换为datetime类型
        df['时间戳'] = pd.to_datetime(df['时间戳'])
        return df
    except Exception as e:
        print(f"加载数据文件时出错: {str(e)}")
        return None


def plot_cpu_usage(df, output_file=None, show_plot=True):
    """绘制CPU使用率曲线图"""
    plt.figure(figsize=(12, 6))
    plt.plot(df['时间戳'], df['CPU使用率(%)'].astype(float), 'b-', linewidth=2)
    
    plt.title(f"{df['进程名'].iloc[0]} 进程的CPU使用率")
    plt.xlabel('时间')
    plt.ylabel('CPU使用率 (%)')
    plt.grid(True)
    
    # 格式化x轴时间
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
    plt.gcf().autofmt_xdate()
    
    # 添加统计信息
    avg_cpu = df['CPU使用率(%)'].astype(float).mean()
    max_cpu = df['CPU使用率(%)'].astype(float).max()
    min_cpu = df['CPU使用率(%)'].astype(float).min()
    
    plt.figtext(0.01, 0.01, f"平均: {avg_cpu:.2f}%, 最大: {max_cpu:.2f}%, 最小: {min_cpu:.2f}%",
                fontsize=10, va="bottom", ha="left")
    
    plt.tight_layout()
    
    if output_file:
        plt.savefig(output_file)
        print(f"CPU使用率图表已保存到: {output_file}")
    
    if show_plot:
        plt.show()
    else:
        plt.close()


def plot_memory_usage(df, output_file=None, show_plot=True):
    """绘制内存使用情况曲线图"""
    # 检查内存数据是否为有效数值
    try:
        df['总内存(KB)'] = pd.to_numeric(df['总内存(KB)'], errors='coerce')
        df['堆内存(KB)'] = pd.to_numeric(df['堆内存(KB)'], errors='coerce')
        
        # 去除NaN值
        df = df.dropna(subset=['总内存(KB)'])
        
        plt.figure(figsize=(12, 6))
        
        # 如果有堆内存数据，则绘制两条曲线
        if not df['堆内存(KB)'].isna().all():
            plt.plot(df['时间戳'], df['总内存(KB)'], 'b-', linewidth=2, label='总内存')
            plt.plot(df['时间戳'], df['堆内存(KB)'], 'r-', linewidth=2, label='堆内存')
            plt.legend()
        else:
            plt.plot(df['时间戳'], df['总内存(KB)'], 'b-', linewidth=2)
        
        plt.title(f"{df['进程名'].iloc[0]} 进程的内存使用情况")
        plt.xlabel('时间')
        plt.ylabel('内存使用 (KB)')
        plt.grid(True)
        
        # 格式化x轴时间
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
        plt.gcf().autofmt_xdate()
        
        # 添加统计信息
        avg_mem = df['总内存(KB)'].mean()
        max_mem = df['总内存(KB)'].max()
        min_mem = df['总内存(KB)'].min()
        
        plt.figtext(0.01, 0.01, f"平均总内存: {avg_mem:.2f} KB, 最大: {max_mem:.2f} KB, 最小: {min_mem:.2f} KB",
                    fontsize=10, va="bottom", ha="left")
        
        plt.tight_layout()
        
        if output_file:
            plt.savefig(output_file)
            print(f"内存使用图表已保存到: {output_file}")
        
        if show_plot:
            plt.show()
        else:
            plt.close()
    except Exception as e:
        print(f"绘制内存图表时出错: {str(e)}")


def main():
    """主函数，使用内部配置参数生成图表"""
    print(f"开始处理CSV文件: {CSV_FILE}")
    
    # 加载数据
    df = load_data(CSV_FILE)
    if df is None:
        print("无法加载数据文件，请检查文件路径是否正确")
        return
    
    print(f"成功加载数据，共 {len(df)} 条记录")
    
    # 生成CPU使用率图表
    print("生成CPU使用率图表...")
    plot_cpu_usage(df, CPU_CHART_FILE, SHOW_CHARTS)
    
    # 生成内存使用图表
    print("生成内存使用情况图表...")
    plot_memory_usage(df, MEMORY_CHART_FILE, SHOW_CHARTS)
    
    print("图表生成完成")


if __name__ == '__main__':
    main() 